import axios, { type Method } from 'axios'
import { userInfo } from '@/stores/user'
import router from '@/router'
const store = userInfo()
const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
const instance = axios.create({
  // 配置基地址 超时时间
  baseURL,
  timeout: 10000
})

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 如果本地有token 就在请求头中携带token
    if (store.user?.token) {
      config.headers.Authorization = `Bearer ${store.user.token}`
    }
    return config
  },
  (err) => {
    return Promise.reject(new Error(err))
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    return response.data
  },
  (err) => {
    // 处理token过期
    if (err.response.status === 401) {
      // 退出登录删除pinia中的用户信息
      store.delUser()
      // 拿到当前路由的完整路径 token过期携带路径跳转到登录页面
      router.push(
        `/login?redirectUrl=${encodeURIComponent(
          router.currentRoute.value.fullPath
        )}`
      )
    }

    return Promise.reject(err)
  }
)

// 指定响应数据 res.data的类型
type Data<T> = {
  msg: string
  result: T
}

const request = <T>(
  url: string,
  method: Method = 'GET',
  submitData?: Object
) => {
  return instance.request<T, Data<T>>({
    url,
    method,
    // 动态插入属性 [表达式xxxxx] : value
    [method.toLocaleLowerCase() === 'GET' ? 'params' : 'data']: submitData
  })
}

export { request, baseURL }
